package com.yc.mcp;



import dev.langchain4j.mcp.McpToolProvider;
import dev.langchain4j.mcp.client.DefaultMcpClient;
import dev.langchain4j.mcp.client.McpClient;
import dev.langchain4j.mcp.client.transport.McpTransport;
import dev.langchain4j.mcp.client.transport.stdio.StdioMcpTransport;
import dev.langchain4j.model.chat.ChatModel;
import dev.langchain4j.model.openai.OpenAiChatModel;
import dev.langchain4j.service.AiServices;
import dev.langchain4j.service.SystemMessage;
import dev.langchain4j.service.tool.ToolProvider;
import org.springframework.beans.factory.annotation.Value;

import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class McpDemo {

//    @Value("${tavily.api.key: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}")
//    private static String tavilyApiKey;

    interface Assistant {
        @SystemMessage("你是一个ai助手，可以调用工具来完成用户的问题")
        String chat(String message);
    }

    public static void main(String[] args) throws Exception {
        // 配置OpenAI模型（这里使用DeepSeek作为示例）
        ChatModel model = OpenAiChatModel.builder()
                .modelName("deepseek-chat")
                .apiKey(System.getenv("DEEPSEEK_API_KEY"))
                .baseUrl("https://api.deepseek.com/v1")
//                .httpClientBuilder(new JdkHttpClientBuilder())
                .build();

        // 配置Tavily MCP服务
        String tavilyApiKey = "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";
        if (tavilyApiKey == null) {
            throw new IllegalArgumentException("TAVILY_API_KEY environment variable is not set");
        }

        Map<String, String> environment = new HashMap<>();
        environment.put("TAVILY_API_KEY", tavilyApiKey);

        // 修正后的命令：首先检查你的 npm 安装
        // 方案1：使用 npx 运行 MCP 服务
//        McpTransport tavilyTransport = new StdioMcpTransport.Builder()
//                .command(Arrays.asList("npx", "tavily-mcp@0.1.4"))
//                .environment(environment)
//                .logEvents(true)
//                .build();

        // 方案2：如果你已经全局安装了 tavily-mcp，可以这样使用

        McpTransport tavilyTransport = new StdioMcpTransport.Builder()
                .command(Arrays.asList("tavily-mcp"))
                .environment(environment)
                .logEvents(true)
                .build();


        // 方案3：如果你想使用绝对路径
//
//        McpTransport tavilyTransport = new StdioMcpTransport.Builder()
//                .command(Arrays.asList("D:\\node-v22.14.0-win-x64\\node-v22.14.0-win-x64\\npx.cmd", "-y", "tavily-mcp@0.2.2"))
//                .environment(environment)
//                .logEvents(true)
//                .build();


        McpClient tavilyClient = new DefaultMcpClient.Builder()
                .transport(tavilyTransport)
                .build();

        // 创建包含MCP客户端的工具提供者
        ToolProvider toolProvider = McpToolProvider.builder()
                .mcpClients(List.of(tavilyClient))
                .build();

        // 构建AI服务
        Assistant bot = AiServices.builder(Assistant.class)
                .chatModel(model)
                .toolProvider(toolProvider)
                .build();

        try {
            // 示例调用
            String response = bot.chat( "帮我搜索一下未来几天衡阳的天气，用表格展示");
            System.out.println("RESPONSE: " + response);
        } finally {
            // 关闭MCP客户端
            tavilyClient.close();
        }
    }
}